<?php
/**
 * Widget.class.php
 *
 * DoitPHP挂件(widget)基类
 * @author tommy <streen003@gmail.com>
 * @copyright  Copyright (c) 2010 Tommy Software Studio
 * @link http://www.doitphp.com
 * @license New BSD License.{@link http://www.opensource.org/licenses/bsd-license.php}
 * @version $Id: Widget.class.php 1.3 2011-11-13 20:32:01Z tommy $
 * @package core
 * @since 1.0
 */

if (!defined('IN_DOIT')) {
    exit();
}

abstract class Widget extends Controller {

    /**
     * 视图缓存文件
     *
     * @var string
     */
    protected $cache_file;

    /**
     * 视图缓存重写开关
     *
     * @var boolean
     */
    protected $cache_status = false;

    /**
     * 分析视图缓存文件名
     *
     * @access protected
     * @param string $cache_id 缓存ID
     * @return string
     */
    protected function parse_cache_file($cache_id) {

        return CACHE_DIR . 'html/widgets/' . md5($cache_id) . '.widget.html';
    }

    /**
     * 分析视图缓存文件是否需要重新创建
     *
     * @access public
     * @param string $cache_id 缓存ID
     * @param integer $lifetime 缓存文件生存周期, 默认为一年
     * @return boolean
     */
    public function cache($cache_id = null, $lifetime = null) {

        //参数分析
        if (is_null($cache_id)) {
            $cache_id = $this->get_widget_id();
        }
        if (is_null($lifetime)) {
            $lifetime = 31536000;
        }

        //获取缓存文件
        $cache_file = $this->parse_cache_file($cache_id);

        if (is_file($cache_file) && (filemtime($cache_file) + $lifetime >= time())) {
            include $cache_file;
            exit();
        }

        $this->cache_status = true;
        $this->cache_file   = $cache_file;

        return true;
    }

    /**
     * 创建缓存文件
     *
     * @access protected
     * @param string $cache_file 缓存文件名
     * @param string $content 缓存文件内容
     * @return boolean
     */
    protected function create_cache_file($cache_file, $content = null) {

        //参数分析
        if (!$cache_file) {
            return false;
        }
        if (is_null($content)) {
            $content = '';
        }

        //分析缓存目录
        $cache_dir = dirname($cache_file);
        if (!is_dir($cache_dir)) {
            mkdir($cache_dir, 0777, true);
        } else if (!is_writable($cache_dir)) {
            chmod($cache_dir, 0777);
        }

        return file_put_contents($cache_file, $content, LOCK_EX);
    }


    /**
     * 显示当前页面内容
     *
     * 注:由于挂件程序的视图文件放在特定的目录里,所以挂件不支持多种主题
     * @access public
     * @param sring $view_name    视图文件名
     * @param array $_data        视图变量数组
     * @return void
     */
    public function display($view_name = null, $_data = array()) {

        //模板变量赋值
        if (!empty($this->_options)) {
               extract($this->_options, EXTR_PREFIX_SAME, 'data');
            //清空不必要的内存占用
            $this->_options = array();
        }

        //参数分析
        $view_file = $this->view($view_name);

        if (!empty($_data) && is_array($_data)) {
            extract($_data, EXTR_PREFIX_SAME, 'data');
            unset($_data);
        }

        ob_start();
        include $view_file;
        $widget_content = ob_get_clean();

        echo $widget_content;

        //创建缓存文件
        if ($this->cache_status == true) {
            $this->create_cache_file($this->cache_file, $widget_content);
        }
    }

    /**
     * 分析挂件(widget)的视图文件路径
     *
     * 注:这里的视图指的是挂件的视图文件
     * @access public
     * @param string $file_name    视图文件名.注:不含文件后缀
     * @return string            文件路径
     */
    public function view($file_name = null) {

        //参数分析
        if (is_null($file_name)) {
            $file_name = $this->get_widget_id();
        }

        return WIDGET_DIR . 'views/' . $file_name . '.php';
    }

    /**
     * 获取当前Widget的名称
     *
     * @access protected
     * @return string
     */
    protected function get_widget_id() {

        return substr(strtolower(get_class($this)), 0, -6);
    }

    /**
     * 设置视图布局(layout)
     *
     * 注:挂件中不支持layout
     * @access public
     * @return boolean
     */
    public function set_layout() {

        return false;
    }

    /**
     * 设置视图主题
     *
     * 注:挂件中不支持视图主题
     * @access public
     * @return boolean
     */
    public function set_theme() {

        return false;
    }

    /**
     * 视图类的实例化
     *
     * 注:视图文件仅限于HTML格式的
     * @access public
     * @return boolean
     */
    public function template() {

        $object = WidgetTemplate::getInstance();
        $object->widget = $this->get_widget_id();

        return $object;
    }

    /**
     * 运行挂件
     *
     * @access public
     * @return void
     */
    public function render(){

    }
}